/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controller.Pronosticos;

import Entity.Periodo;
import java.util.ArrayList;

/**
 *
 * @author camilourd
 */
public class SuavizacionExponencialSimple extends MetodosPronosticos {

    public SuavizacionExponencialSimple() {
        super();
    }
    
    public void addPeriodo(String name, double demand, double at) {
        dmp.getPers().add(new Periodo(name, demand, at));
    }
    
    public void calcular(int numPers) {
        double sumyt = 0, ytmin, ytmax, a, b, data;
        ArrayList<Periodo> pers = dmp.getPers();
        int n = pers.size() - 1;
        
        if(n >= 0) {
            ytmin = ytmax = pers.get(0).getDemanda();
            
            // suma las demandas de los periodos
            for(Periodo p: pers) {
                sumyt += p.getDemanda();

                if(ytmin > p.getDemanda()) ytmin = p.getDemanda();
                if(ytmax < p.getDemanda()) ytmax = p.getDemanda();
            }

            if(dmp.getAlpha() == 0.0) dmp.setAlpha((ytmax - ytmin) / ytmax);

            // calcula los at
            double alpha = dmp.getAlpha();
            double inv = 1.0 - alpha;
            
            pers.get(0).setAt(sumyt / (1.0 * (n + 1)));
            
            for(int i = 1;i <= n; ++i){
                data = (alpha * pers.get(i).getDemanda()) + (inv * pers.get(i - 1).getAt());
                if(data < 0.0) data = 0.0;
                pers.get(i).setAt(data);
            }

            // calcular a y b
            double ytn = pers.get(n).getDemanda();
            double atn = pers.get(n).getAt();

            a = (ytn * 2) - atn;
            b = (alpha / inv) * (ytn - atn);

            dmp.setA(a);
            dmp.setB(b);

            // calcular pronósticos
            dmp.getYp().add(pers.get(n).getDemanda());
            
            for(int i = 1;i <= numPers; ++i) {
                data = a + (b * i);
                if(data < 0.0) data = 0.0;
                dmp.getYp().add(data);
            }

            double ypn = dmp.getYp().get(1);
            // calcular errores
            calcularErrores(ytn, ypn, (n + 1) * 1.0);
        }
    }
    
    public void obtenerAt(javax.swing.JTable table) {
        ArrayList<Periodo> pers = dmp.getPers();
        int n = pers.size();
        
        for(int i = 0;i < n; ++i) {
            table.setValueAt(aproxDouble(pers.get(i).getAt()), i, 2);
        }
    }
}
